package io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 通过提高每次读写的数据量,减少读写的次数,可以提高读写的效率
 *
 * 单字节的读写效率普遍较差
 * 而块读写效率普遍较好
 *
 * 块读写:一组一组的字节进行读写
 */
public class CopyDemo2 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("img.png");
        FileOutputStream fos = new FileOutputStream("img_cp2.png");

        /*
            文件流提供了块读写的方法
            InputStream上为所有字节输入流提供了块读取数据的定义:
            int read(byte[] data)
            一次性读取给定数组长度的字节量,并存入到该数组中,返回值为实际读取到的字节数
            如果返回值为-1,表示读取到了文件末尾

            OutputStream上为所有字节输出流提供了块写数据的定义
            void write(byte[] data)
            一次性将给定数组中的所有字节写出

            void write(byte[] data,int off,int len)
            一次性将给定数组data从下标off处开始的连续len个字节写出
         */
        int len;//用于记录每次实际读取到的字节数
        byte[] data = new byte[10240];//10kb
        long start = System.currentTimeMillis();
        while((len = fis.read(data))!=-1){//一次性从文件中读取10kb并存入data数组
//            fos.write(data);//一次性将data数组中所有数据写入文件
            fos.write(data,0,len);
        }
        long end = System.currentTimeMillis();

        System.out.println("复制完毕,耗时:"+(end-start)+"ms");
        fis.close();
        fos.close();
    }
}









